unit u_student_frame;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, ExtCtrls,u_testing_form;

type

  { Tf_Student_frame }

  Tf_Student_frame = class(TFrame)
    b_View_results: TButton;
    b_Start_test: TButton;
    lb_Tests_for_student: TListBox;
    p_Buttons: TPanel;
    procedure b_Start_testClick(Sender: TObject);
    procedure b_View_resultsClick(Sender: TObject);
    procedure lb_Tests_for_studentSelectionChange(Sender: TObject; User: boolean
      );
  private
    { private declarations }
  public
    { public declarations }
    l_Tests:TList;
    procedure p_Fill_tests_list();
  end;

implementation

{$R *.lfm}

uses
  u_Core;

procedure Tf_Student_frame.p_Fill_tests_list(); //Заполнения листбокса названиями тестов
var
  i:integer;
  core_error:T_Core_errors;
  test_status:T_test_status;
  s_test_name:string;
begin
  if l_Tests=nil then                  //Если список не создан, создаём
     l_Tests:=TList.Create
  else
    l_Tests.Clear;                    //Иначе  очищаем тот, что есть
  core_error:=user.f_Get_tests_list(l_Tests);   //вызываем процедуру заполнения списка // Не очень мне нравится такой ход - передача указателя в параметры
  for i:=0 to l_Tests.Count-1 do                //Для каждого элемента списка проверяем статус теста
  begin                                         // Добавляем имя теста в листбокс, если тест пройден, приписываем 'ПРОЙДЕН'
    core_error:=Ttest(l_Tests.Items[i]).f_Get_status(test_status);
    case test_status of
      COMPLETE:
        begin
          core_error:=TTest(l_Tests.Items[i]).f_Get_name(s_test_name);
          lb_Tests_for_student.Items.Add(s_test_name+'(Пройден)'); //вообще хотели цветами помечать, но там не так просто как хотелось бы.
        end;
      AVAILABLE:        //а ещё можно не статусы, а баллы писать и по темам разделять или ещё по каким-то параметрам
        begin
          core_error:=TTest(l_Tests.Items[i]).f_Get_name(s_test_name);
          lb_Tests_for_student.Items.Add(s_test_name);
        end;
      else lb_Tests_for_student.Items.Add('Ошибка'); //если тип доступа не такой, как ожидалось, пишем в листбокс ошибку.
    end;
  end;
end;

procedure Tf_Student_frame.lb_Tests_for_studentSelectionChange(Sender: TObject;
  User: boolean);             //Выбор строки в листбоксе
var
  test_status:T_test_status;
begin
  Ttest(l_Tests[lb_Tests_for_student.ItemIndex]).f_Get_status(test_status);
  case test_status of  //проверяем статус выбранного теста
  AVAILABLE:                             //Если тест доступен для выполнения
    begin
      b_Start_test.Enabled:=TRUE;       //активируем кнопку запуска тестирования
      b_View_results.Enabled:=FALSE;    //и деактивируем кнопку просмотра результатов
    end;
  COMPLETE:                            //Если тест выполнен
    begin
      b_Start_test.Enabled:=FALSE;    //активируем кнопку  просмотра результатов
      b_View_results.Enabled:=TRUE;   //и деактивируем кнопку запуска тестирования
    end;
  end;
end;

procedure Tf_Student_frame.b_Start_testClick(Sender: TObject);   //Запуск теста
begin
  u_testing_Form.f_Testing_form:=u_testing_Form.Tf_Testing_form.Create(Self,lb_Tests_for_student.ItemIndex);  //Создаём форму тестирования и передаём в её конструктор ID теста
  u_testing_Form.f_Testing_form.ShowModal();
end;

procedure Tf_Student_frame.b_View_resultsClick(Sender: TObject);
begin
  //Просмотр результатов теста
end;

end.

